home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / misc / build_archive next >
Text File  |  2000-01-12  |  2KB  |  64 lines

  1. #!/usr/bin/perl
  2.  
  3. #- Simple cat archive with bzip2 for perl.
  4. #- read file list and produce a perl script in stdout with hash data and $ARGV[0].cz2 archive file.
  5. #- hash data is :
  6. #-   { 'filename' => [ $off1, $siz1, $off2, $siz2 ], ... }
  7. #- bzip2 -d between ..1 and ..2
  8. use strict qw(subs vars refs);
  9.  
  10. sub main {
  11.     my ($name, $maxsiz) = @_;
  12.     my ($off1, $siz1, $off2, $siz2) = (0, 0, 0, 0);
  13.     my @filelist = ();
  14.     my %data = ();
  15.  
  16.     die "usage: $0 <name> <maxsiz>" unless $maxsiz > 100000;
  17.  
  18.     unlink "$name.cz2";
  19.  
  20.     foreach (<STDIN>) {
  21.     chomp;
  22.  
  23.     my $file = $_; die "unable to find file $file" unless -e $file;
  24.     $siz2 = -s $file;
  25.  
  26.     push @filelist, $file;
  27.     $data{$file} = [ -1, -1, $off2, $siz2 ];
  28.  
  29.     if ($off2 + $siz2 > $maxsiz) { #- need compression.
  30.         system "cat @filelist | bzip2 -3 >tmp.bz2";
  31.         $siz1 = -s "tmp.bz2";
  32.  
  33.         $data{$_} = [ $off1, $siz1, $data{$_}[2], $data{$_}[3] ] foreach @filelist;
  34.  
  35.         system "cat tmp.bz2 >>$name.cz2";
  36.         $off1 += $siz1;
  37.         $off2 = 0; $siz2 = 0;
  38.         @filelist = ();
  39.     }
  40.     $off2 += $siz2;
  41.     }
  42.     if (scalar @filelist) {
  43.     system "cat @filelist | bzip2 -3 >tmp.bz2";
  44.     $siz1 = -s "tmp.bz2";
  45.  
  46.     $data{$_} = [ $off1, $siz1, $data{$_}[2], $data{$_}[3] ] foreach @filelist;
  47.  
  48.     system "cat tmp.bz2 >>$name.cz2";
  49.     $off1 += $siz1;
  50.     print STDERR "archive size of $name.cz2 is $off1\n";
  51.     }
  52.  
  53.     local *OUTPUT;
  54.     open OUTPUT, ">$name.cz2.pl";
  55.     print OUTPUT "\%data = (\n";
  56.     foreach (keys %data) {
  57.     print OUTPUT "\'$_\' => [ ". join(', ', @{$data{$_}}) ." ],\n";
  58.     }
  59.     print OUTPUT ");\n";
  60. }
  61.  
  62. main(@ARGV);
  63. unlink "tmp.bz2";
  64.